/**
 * 基础工具类 - 共享的辅助函数
 */

class QuestionGeneratorBase {
    /**
     * 打乱数组顺序
     */
    static shuffleArray(array) {
        const newArray = [...array];
        for (let i = newArray.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [newArray[i], newArray[j]] = [newArray[j], newArray[i]];
        }
        return newArray;
    }

    /**
     * 格式化小数显示
     */
    static formatDecimal(decimal) {
        if (decimal === 0.5) return '0.5';
        if (decimal === 0.25) return '0.25';
        if (decimal === 0.2) return '0.2';
        if (decimal === 0.1) return '0.1';

        // 对于其他小数，保留4位有效数字
        return decimal.toFixed(4).replace(/\.?0+$/, '');
    }

    /**
     * 格式化数字显示
     */
    static formatNumber(number) {
        if (Number.isInteger(number)) {
            return number.toString();
        }
        // 最多保留2位小数，移除尾随零
        return parseFloat(number.toFixed(2)).toString();
    }

    /**
     * 格式化操作数显示
     */
    static formatOperandForDisplay(number, valueType) {
        if (valueType === 'percentage') {
            // 百分数显示为百分数形式，最多保留2位小数
            const percentValue = number * 100;
            return `${parseFloat(percentValue.toFixed(2))}%`;
        } else {
            // 其他类型按原有方式显示
            return this.formatNumber(number);
        }
    }

    /**
     * 格式化答案用于选择题显示
     */
    static formatAnswerForChoice(answer, valueType) {
        if (valueType === 'percentage') {
            const percentValue = answer * 100;
            return `${parseFloat(percentValue.toFixed(2))}%`;
        } else {
            return this.formatNumber(answer);
        }
    }

    /**
     * 计算小数位数
     */
    static countDecimalPlaces(number) {
        if (Number.isInteger(number)) return 0;
        const str = number.toString();
        if (str.indexOf('.') !== -1 && str.indexOf('e-') === -1) {
            return str.split('.')[1].length;
        } else if (str.indexOf('e-') !== -1) {
            const parts = str.split('e-');
            return parseInt(parts[1], 10);
        }
        return 0;
    }

    /**
     * 四舍五入到指定小数位数
     */
    static roundToDecimalPlaces(number, places) {
        return Math.round(number * Math.pow(10, places)) / Math.pow(10, places);
    }

    /**
     * 判断答案是否在容错范围内（3%误差）
     * @param {number} userAnswer 用户答案
     * @param {number} correctAnswer 正确答案
     * @returns {boolean} 是否正确
     */
    static isAnswerCorrectWithTolerance(userAnswer, correctAnswer) {
        const tolerance = Math.abs(correctAnswer) * 0.03; // 3%容错率
        return Math.abs(userAnswer - correctAnswer) <= tolerance;
    }
}

export default QuestionGeneratorBase;
